package br.com.pnfp.web.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.pnfp.web.model.dao.IDoadorDAO;
import br.com.pnfp.web.model.enums.Ativo;
import br.com.pnfp.web.model.enums.SimNao;
import br.com.pnfp.web.model.enums.UF;
import br.com.pnfp.web.model.vo.Cidade;
import br.com.pnfp.web.model.vo.Doador;
import br.com.pnfp.web.model.vo.Entidade;
import br.com.pnfp.web.model.vo.Localidade;
import br.com.pnfp.web.model.vo.RamoAtividade;
import br.com.pnfp.web.model.vo.Usuario;

@Repository
public class DoadorDAO extends DAO implements IDoadorDAO {

	@Override
	public List<Doador> consultar(Doador vo) {

		String sql = "SELECT doador.cd_doador, doador.dc_cnpj, doador.dc_razao_social, " +
				"doador.cd_ramo_atividade, ramo.dc_ramo_atividade, " +
				"doador.cd_localidade, local.nm_localidade, " +
				"doador.cd_usuario_cadastro, doador.dt_cadastro, doador.id_ativo, cidade.sg_uf, " +
				"(select cd_entidade from tb_entidade_doador ed where ed.cd_doador = doador.cd_doador and ed.id_atual = 1) entidade " +
				"FROM tb_doador doador, tb_ramo_atividade ramo, tb_localidade local, tb_cidade cidade, tb_usuario usuario WHERE " +
				"doador.cd_ramo_atividade = ramo.cd_ramo_atividade and " +
				"doador.cd_localidade = local.cd_localidade and " +
				"doador.cd_usuario_cadastro = usuario.cd_usuario and " +
				"local.cd_cidade = cidade.cd_cidade and ";
		Object[] params = {};
		if(vo.getCodigo() != null) {
			sql += "doador.cd_doador = ? and ";
			params = new Object[]{vo.getCodigo()};
		} else if(vo.getCnpj() != null && !vo.getCnpj().equals("")) {
			sql += "doador.dc_cnpj = ? and ";
			params = new Object[]{vo.getCnpj()};
		} else if(vo.getRamoAtividade() != null && vo.getRamoAtividade().getCodigo() != null && vo.getRamoAtividade().getCodigo() > 0) {
			sql += "doador.cd_ramo_atividade = ? and ";
			params = new Object[]{vo.getRamoAtividade().getCodigo()};
		} else if(vo.getRazaoSocial() != null && !vo.getRazaoSocial().equals("")) {
			sql += "doador.dc_razao_social like ? and ";
			params = new Object[]{vo.getRazaoSocial()+"%"};			
		} else if(vo.getLocalidade() != null && vo.getLocalidade().getCidade() != null && vo.getLocalidade().getCidade().getUf() != null) {
			sql += "cidade.sg_uf = ? and ";
			params = new Object[]{vo.getLocalidade().getCidade().getUf().name()};	
		} else if(vo.getAssociado() != null && vo.getAssociado().equals(SimNao.NAO)) {
			sql += "(select cd_entidade from tb_entidade_doador ed where ed.cd_doador = doador.cd_doador and ed.id_atual = 1) IS NULL and ";			
		} else if(vo.getEntidade() != null && vo.getEntidade().getCodigo() > 0) {
			sql += "(select cd_entidade from tb_entidade_doador ed where ed.cd_doador = doador.cd_doador and ed.id_atual = 1 and ed.cd_entidade = ?) and ";
			params = new Object[]{vo.getEntidade().getCodigo()};
		}
		sql += "usuario.cd_empresa = " + vo.getUsuarioSistema().getEmpresa().getCodigo() + " and ";
		sql += "doador.id_ativo = 1 order by doador.dc_cnpj";

		List<Doador> result = query(sql, params, new RowMapper<Doador>() {
			@Override
			public Doador mapRow(ResultSet rs, int arg1) throws SQLException {
				Doador vo = new Doador();
				vo.setCodigo(rs.getInt("doador.cd_doador"));
				vo.setCnpj(rs.getString("doador.dc_cnpj"));
				vo.setRazaoSocial(rs.getString("doador.dc_razao_social"));
				vo.setRamoAtividade(new RamoAtividade(rs.getInt("doador.cd_ramo_atividade")));
				vo.getRamoAtividade().setDescricao(rs.getString("ramo.dc_ramo_atividade"));
				vo.setLocalidade(new Localidade(rs.getInt("doador.cd_localidade")));
				vo.getLocalidade().setNome(rs.getString("local.nm_localidade"));
				vo.getLocalidade().setCidade(new Cidade(UF.valueOf(rs.getString("cidade.sg_uf"))));
				if(rs.getObject("entidade") != null)
					vo.setEntidade(new Entidade(rs.getInt("entidade")));
				vo.setUsuarioSistema(new Usuario(rs.getInt("doador.cd_usuario_cadastro")));
				vo.setDataCadastro(rs.getDate("doador.dt_cadastro"));
				vo.setAtivo(Ativo.setValue(rs.getInt("doador.id_ativo")));
				return vo;
			}
			
		});		
		
		return result;
	}
	
	@Override
	public Entidade consultaCliente(Doador vo) {
		String sql = "SELECT cd_entidade FROM tb_entidade_doador where cd_doador = ? and id_atual = 1";
		Entidade entidade = queryForObject(sql, new Object[] {vo.getCodigo()}, new RowMapper<Entidade>() {
			@Override
			public Entidade mapRow(ResultSet rs, int arg1) throws SQLException {
				Entidade entidade = new Entidade();
				entidade.setCodigo(rs.getInt("cd_entidade"));
				return entidade;
			}
		});
		return entidade;
	}
	
	@Override
	public void incluir(Doador vo) {
		String sql = "INSERT INTO tb_doador(dc_cnpj, dc_razao_social, cd_ramo_atividade, cd_localidade, cd_usuario_cadastro, dt_cadastro) values(?,?,?,?,?,?)";
		update(sql, new Object[] {vo.getCnpj(), vo.getRazaoSocial(), vo.getRamoAtividade().getCodigo(), vo.getLocalidade().getCodigo(), vo.getUsuarioSistema().getCodigo(), new Date()});
	}
	
	@Override
	public void alterar(Doador vo) {
		String sql = "UPDATE tb_doador set dc_cnpj = ?, dc_razao_social = ?, cd_ramo_atividade = ?, cd_localidade = ?, cd_usuario_cadastro = ? where cd_doador = ?";
		update(sql, new Object[] {vo.getCnpj(), vo.getRazaoSocial(), vo.getRamoAtividade().getCodigo(), vo.getLocalidade().getCodigo(), vo.getUsuarioSistema().getCodigo(), vo.getCodigo()});
	}
	
	@Override
	public void excluir(Integer id) {
		String sql = "DELETE FROM tb_entidade_doador where cd_doador = ? and id_atual = 1";
		update(sql, new Object[] {id});
	
		sql = "UPDATE tb_doador set id_ativo = 0 where cd_doador = ?";
		update(sql, new Object[] {id});
	}

}
